package demo1;

import java.util.Scanner;

class Person {
    //throw 抛出一个异常  throws(用于方法(参数)后) 声明一个异常
    public static void fun(int[] a)  {
        if (a == null) {
            throw new NullPointerException();
            //System.out.println("123");
        }
    }
}
class Student {
    public static void fun() throws CloneNotSupportedException{
        Person.fun(null);
        int[] array = null;
        System.out.println(array[0]);
        //throw new NullPointerException();  运行时异常抛出时不需要 在方法的后面进行抛出异常声明
    }
}
public class Test2 {
    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);
        //try (Scanner input = new Scanner(System.in))  可以把Scanner 写进try括号中  那么在finally中就不需要释放
        //如果try中存在多个异常  那只会抛出第一个出现的异常
        try {  //如果try中语句的异常在catch中没有找到  那么JVM会直接抛出异常 且中断程序
            int[] a = {1,2,3};
            Student.fun();
            System.out.println(a[10]);
            System.out.println(10/0);//ArithmeticException
            Person.fun(null);

            //catch (CloneNotSupportedException | ArithmeticException e) {         }   可以这样判断两个
        }catch (CloneNotSupportedException e) {
            e.printStackTrace();
            System.out.println("捕捉到了 CloneNotSupportedException  异常");
        }catch (ArithmeticException e) {
            e.printStackTrace();
            System.out.println("捕捉到了   ArithmeticException   异常");
        }catch (ArrayIndexOutOfBoundsException e){
            e.printStackTrace();
            System.out.println("捕捉到了   ArrayIndexOutOfBoundsException   异常");
        } catch (NullPointerException e) {
            System.out.println("捕捉到了  NullPointerException    异常");
        }finally {     //不管是否在Try中抛出异常  finally都会执行     finally用于资源释放
            System.out.println("finally用于资源释放");
            input.close();
            //return 9;  不建议在finally当中  不建议写return
        }
        /*catch (Exception e) {  //一劳永逸  不建议
            e.printStackTrace();
            System.out.println("捕捉到了  Exception 异常");
        }*/
        System.out.println("正常逻辑执行");
    }
}
